module vga_driver #(
	parameter	H_DISP	= 10'd640,		    //行有效数据
	parameter	V_DISP	= 10'd480		    //场有效数据
)
(
	input					vga_clk,		//VGA驱动时钟
	input					sys_rst_n,		//复位信号
	
	input					H_SYNC,		    //行同步
	input					H_BACK,		    //行显示后沿
	input					H_FRONT,		//行显示前沿
	input					H_TOTAL,		//行扫描周期

	input					V_SYNC,			//场同步
	input					V_BACK,		    //场显示后沿
	input					V_FRONT,		//场显示前沿
	input					V_TOTAL,		//场扫描周期
	
	//VGA接口
	output					vga_hs,			//行同步信号
	output					vga_vs,			//场同步信号
	output		    [11:0]	vga_rgb,		//红绿蓝三原色输出，分为RGB444,RGB565
	
	input			[11:0]	pixel_data,		//像素点数据
	output		    [12:0]	pixel_xpos,		//像素点横坐标，加1位以便支持更高分辨率
	output		    [12:0]	pixel_ypos		//像素点纵坐标，加1位以便支持更高分辨率
);

	//reg define
	reg			[12:0]	cnt_h;
	reg			[12:0]	cnt_v;

	//wire define
	wire						vga_en;
	wire						data_req;

	//VGA行场同步信号
	assign vga_hs	= (cnt_h < H_SYNC) ? 1'b0 : 1'b1;
	assign vga_vs	= (cnt_v < V_SYNC) ? 1'b0 : 1'b1;

	//RGB有效数据输出信号
	assign vga_en	= (((cnt_h >= H_SYNC + H_BACK) && (cnt_h < H_TOTAL - H_FRONT))
							&& ((cnt_v >= V_SYNC + V_BACK) && (cnt_v < V_TOTAL - V_FRONT)))
							? 1'b1 : 1'b0;
	
	//RGB有效数据输出
	assign vga_rgb = vga_en ? pixel_data : 12'd0;

	//像素点颜色数据输入请求信号
	assign data_req = (((cnt_h >= H_SYNC + H_BACK) && (cnt_h < H_TOTAL - H_FRONT))
							&& ((cnt_v >= V_SYNC + V_BACK) && (cnt_v < V_TOTAL - V_FRONT)))
							? 1'b1 : 1'b0;
							
	//像素点坐标
	assign pixel_xpos = data_req ? (cnt_h - (H_SYNC + H_BACK)) : 13'd0;
	assign pixel_ypos = data_req ? (cnt_v - (V_SYNC + V_BACK)) : 13'd0;

	//行计数器对像素时钟计数
	always @ (posedge vga_clk or negedge sys_rst_n) begin
		if(!sys_rst_n) cnt_h <= 13'd0;
		else if(cnt_h < H_TOTAL) cnt_h <= cnt_h + 1'b1;
		else cnt_h <= 13'd0;
	end

	//场计数器对行计数
	always @ (posedge vga_clk or negedge sys_rst_n) begin
		if(!sys_rst_n) cnt_v <= 13'd0;
		else if(cnt_h == H_TOTAL - 1'b1) begin
			if(cnt_v < V_TOTAL) cnt_v <= cnt_v + 1'b1;
			else cnt_v <= 13'd0;
		end
		else cnt_v <= cnt_v;
	end

endmodule